#ifndef MYCONFIG_HPP  
#define MYCONFIG_HPP 

#include"util.hpp"
#include<mutex>
#define CONFIG_FILE "./cloud.conf"

namespace cloud{

class Config
{
    private:
    Config(){ReadConfigFile();}    
    static Config *_instance;   
    static std::mutex _mutex;  // 声明 

    private:
    int _hot_time;     //热点文件判断时间
    int _server_port;  //服务端端口号
    std::string _server_ip; //服务端ip地址
    std::string _download_prefix; //文件下载URL前缀路径
    std::string _packfile_suffix; //压缩包后缀名称
    std::string _pack_dir;//备份文件存放路径
    std::string _back_dir;//压缩文件存放路径
    std::string _backup_file;//备份文件信息管理



    bool ReadConfigFile()
    {
     FileUtil fu(CONFIG_FILE);     //定义对象获取cloud.conf文件中的配置信息
     std::string body;
     if(fu.GetContent(&body)==false)     //将配置信息读到body中
     {
     std::cout<<"load config file failed!\n";
     return false;
     }
     Json::Value root;                      //反序列化，配置信息放到root中  
     if(JsonUtil::UnSerialize(body,&root)==false)    
     {
       std::cout<<"parse config file failed!\n";
       return false;

     }
    /*将反序列化的配置信息放到类的配置变量中*/

    _hot_time=root["hot_time"].asInt();
    _server_port=root["server_port"].asInt();
    _server_ip=root["server_ip"].asString();
    _download_prefix=root[ "download_prefix"].asString();
    _packfile_suffix=root[ "packfile_suffix"].asString();
    _pack_dir=root["pack_dir"].asString();
    _back_dir=root["back_dir"].asString();
    _backup_file=root["backup_file"].asString();
    return true;
     /*将反序列化的配置信息放到类的配置变量中*/

    }

    public:
    static Config *GetInstance()  //懒汉模式获取类对象指针
    {
     if(_instance==nullptr)   //防止每次判断是否第一次创建该类频繁拿锁
     {   _mutex.lock();      //加锁防止多线程拿到唯一类入口指针        
     if(_instance==nullptr)
       {
         _instance=new Config();

       }
    _mutex.unlock();}
    return _instance;//除了一一次，直接拿

    }


    
    int GetHotTime()
    {
     return  _hot_time;


    }
    int GetServerPort()
    {

     return _server_port;

    }
    std::string GetServerIp()
    {


    return  _server_ip;


    }
    std::string GetDownloadPrefix()
    {

   return  _download_prefix;


    }
    std::string GetpackFileSuffix()
    {



        return _packfile_suffix;
    }
    std::string GetPackDir()
    {

     return _pack_dir;

    }
    std::string GetBackDir()
    {

    return _back_dir;


    }
    std::string GetBackupFile()
    {

    return _backup_file;


    }


};
Config *Config::_instance=nullptr;  //静态变量类内声明，类外初始化
std::mutex Config::_mutex;


}
#endif